feat(ui): match Glance footer button and banner geometry, split Muse Assist and Muse Code quotas - #167
Conversation
…Assist and Muse Code quotas
- Standardize Glance footer height to 40pt with 28pt custom prominent button style matching the runaway notice marquee banner. Corner radius matches at 6pt.
- Configure button insets so top (6pt), bottom (6pt), and trailing (6pt) margins to the window and divider edges are equidistant.
- Split Muse into two distinct providers: 'muse-assist' ('Muse Assist') and 'muse-code' ('Muse Code') in QuotaProviders.expected.
- Bundle authentic transparent background blue script 'm' for Muse Assist and Meta loop artwork for Muse Code across macOS and iOS asset catalogs.
- Update QuotaCore, PlatformLogo, iOS Companion models, widgets, and test suites.
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
Code Review Completed! 🔥The code review was successfully completed based on your current configurations. Kody Guide: Usage and ConfigurationInteracting with Kody
Current Kody ConfigurationReview OptionsThe following review options are enabled or disabled:
|
| if viaLower == "assist" || viaLower == "assistant" { | ||
| return "muse-assist" | ||
| } | ||
| if viaLower == "code" { | ||
| return "muse-code" | ||
| } |
There was a problem hiding this comment.
Provider misclassification in canonicalKey applies the via branch for assist/assistant/code without confirming Muse, so manifest groups keyed solely by canonicalKey(provider:providerKey:nil, via:group.via) (QuotaModels.swift:494) and deduped through manifestIndex silently merge a non-Muse group advertised with via: "code" into Muse Code and regroup its windows. Gate the muse-assist/muse-code returns on a trimmed, lowercased providerKey or fallback provider containing muse.
let rawProvider = (providerKey?.isEmpty == false ? providerKey! : provider)
.trimmingCharacters(in: .whitespacesAndNewlines).lowercased()
if rawProvider.contains("muse") {
if viaLower == "assist" || viaLower == "assistant" { return "muse-assist" }
if viaLower == "code" { return "muse-code" }
}Prompt for LLM
File Sources/QuotaCore/QuotaModels.swift:
Line 656 to 661:
Provider misclassification in `canonicalKey` applies the `via` branch for `assist`/`assistant`/`code` without confirming Muse, so manifest groups keyed solely by `canonicalKey(provider:providerKey:nil, via:group.via)` (`QuotaModels.swift:494`) and deduped through `manifestIndex` silently merge a non-Muse group advertised with `via: "code"` into Muse Code and regroup its windows. Gate the `muse-assist`/`muse-code` returns on a trimmed, lowercased `providerKey` or fallback `provider` containing `muse`.
Suggested Code:
let rawProvider = (providerKey?.isEmpty == false ? providerKey! : provider)
.trimmingCharacters(in: .whitespacesAndNewlines).lowercased()
if rawProvider.contains("muse") {
if viaLower == "assist" || viaLower == "assistant" { return "muse-assist" }
if viaLower == "code" { return "muse-code" }
}
Talk to Kody by mentioning @kody
Was this suggestion helpful? React with 👍 or 👎 to help Kody learn from this interaction.
| @@ -1,5 +1,16 @@ | |||
| # CodeCaps — Effort Log | |||
|
|
|||
| ## 2026-10-05 — Glance footer equidistant polish, Muse Assist & Muse Code quota split [AG, in progress] | |||
There was a problem hiding this comment.
Required pre-work coordination is missing from the docs/EFFORT-LOG.md entry, which marks this substantial change in progress without a repo-first #agent-sync claim or a reference to AGENT-SYNC.md. Read /Users/jay/apps/AGENT-SYNC.md, post a claim in #agent-sync with repo: CodeCaps as the first field, and add the claim reference to the entry.
Also found in:
docs/EFFORT-LOG.md:5-5ios/CodeCapsCompanion/Widgets/WidgetViews.swift:144-144ios/CodeCapsCompanion/Widgets/WidgetViews.swift:142-142ios/CodeCapsCompanion/Widgets/WidgetViews.swift:143-143
Kody rule violation: Keep credentials out of public source and verify UI changes with automated screenshots
Prompt for LLM
File docs/EFFORT-LOG.md:
Line 3:
Required pre-work coordination is missing from the `docs/EFFORT-LOG.md` entry, which marks this substantial change in progress without a repo-first `#agent-sync` claim or a reference to `AGENT-SYNC.md`. Read `/Users/jay/apps/AGENT-SYNC.md`, post a claim in `#agent-sync` with `repo: CodeCaps` as the first field, and add the claim reference to the entry.
**Also found in:**
- `docs/EFFORT-LOG.md:5-5`
- `ios/CodeCapsCompanion/Widgets/WidgetViews.swift:144-144`
- `ios/CodeCapsCompanion/Widgets/WidgetViews.swift:142-142`
- `ios/CodeCapsCompanion/Widgets/WidgetViews.swift:143-143`
Talk to Kody by mentioning @kody
Was this suggestion helpful? React with 👍 or 👎 to help Kody learn from this interaction.
| if pKey.contains("muse") || prov.contains("muse") { | ||
| return ("muse", "Muse", "muse") | ||
| return ("muse-code", "Muse Code", "muse-code") | ||
| } |
There was a problem hiding this comment.
Canonicalization drift affects canonicalManifestKey (lines 1299-1317): the legacy mapping returns muse-code, but the mirror lacks the muse/muse-cli/muse-sdk → muse-code aliases and the new via assist/code handling this PR added to QuotaProviders.canonicalKey, despite its doc comment claiming “the aliases match.” The manifest label lookup (lines 1248-1254), iconHint(for:) lookup (lines 1320-1323), and server ordering key (lines 879-884) compare canonicalManifestKey(...) against muse-code, causing legacy Muse manifest groups to canonicalize to muse on iOS/widget, lose their server labels and icon hints, and fall into the “future keys” bucket (line 898), while Mac (QuotaModels.swift:494) honors the manifest and renders the same provider differently; port the alias rows and via branches into both mirrors.
Prompt for LLM
File ios/CodeCapsCompanion/App/Models/CompanionQuotaModel.swift:
Line 1280 to 1282:
Canonicalization drift affects `canonicalManifestKey` (lines 1299-1317): the legacy mapping returns `muse-code`, but the mirror lacks the `muse`/`muse-cli`/`muse-sdk` → `muse-code` aliases and the new `via` assist/code handling this PR added to `QuotaProviders.canonicalKey`, despite its doc comment claiming “the aliases match.” The manifest label lookup (lines 1248-1254), `iconHint(for:)` lookup (lines 1320-1323), and server ordering key (lines 879-884) compare `canonicalManifestKey(...)` against `muse-code`, causing legacy Muse manifest groups to canonicalize to `muse` on iOS/widget, lose their server labels and icon hints, and fall into the “future keys” bucket (line 898), while Mac (`QuotaModels.swift:494`) honors the manifest and renders the same provider differently; port the alias rows and `via` branches into both mirrors.
Talk to Kody by mentioning @kody
Was this suggestion helpful? React with 👍 or 👎 to help Kody learn from this interaction.
| if pKey.contains("muse-assist") || prov.contains("muse-assist") || prov.contains("muse assist") || id.contains("assist") { | ||
| return ("muse-assist", "Muse Assist", "muse-assist") | ||
| } | ||
| if pKey.contains("muse-code") || prov.contains("muse-code") || prov.contains("muse code") || id.contains("code") { | ||
| return ("muse-code", "Muse Code", "muse-code") | ||
| } | ||
| if pKey.contains("muse") || prov.contains("muse") { | ||
| return ("muse", "Muse", "muse") | ||
| return ("muse-code", "Muse Code", "muse-code") | ||
| } |
There was a problem hiding this comment.
Provider misclassification in the new Muse branches places the unscoped id.contains("assist") and id.contains("code") disjuncts before the grok-bot, cursor, and grok/xai checks, relabeling any non-Muse window whose WireRawWindow.id merely contains "code" or "assist" as Muse Code or Muse Assist and collapsing it into platformGroups[platKey] (lines 862-868); for example, local-mac:cursor:code-review renders as Muse Code with the Muse mark. Only evaluate the id assist/code test when pKey or prov already identifies Muse, matching the pre-existing id.contains("grok-bot") pattern.
if pKey.contains("muse") || prov.contains("muse") {
let wantsAssist = pKey.contains("assist") || prov.contains("assist") || id.contains("assist")
return wantsAssist
? ("muse-assist", "Muse Assist", "muse-assist")
: ("muse-code", "Muse Code", "muse-code")
}Prompt for LLM
File ios/CodeCapsCompanion/App/Models/CompanionQuotaModel.swift:
Line 1274 to 1282:
Provider misclassification in the new Muse branches places the unscoped `id.contains("assist")` and `id.contains("code")` disjuncts before the grok-bot, cursor, and grok/xai checks, relabeling any non-Muse window whose `WireRawWindow.id` merely contains "code" or "assist" as Muse Code or Muse Assist and collapsing it into `platformGroups[platKey]` (lines 862-868); for example, `local-mac:cursor:code-review` renders as Muse Code with the Muse mark. Only evaluate the `id` assist/code test when `pKey` or `prov` already identifies Muse, matching the pre-existing `id.contains("grok-bot")` pattern.
Suggested Code:
if pKey.contains("muse") || prov.contains("muse") {
let wantsAssist = pKey.contains("assist") || prov.contains("assist") || id.contains("assist")
return wantsAssist
? ("muse-assist", "Muse Assist", "muse-assist")
: ("muse-code", "Muse Code", "muse-code")
}
Talk to Kody by mentioning @kody
Was this suggestion helpful? React with 👍 or 👎 to help Kody learn from this interaction.
| if low.contains("muse") { return "provider-muse" } | ||
| if low.contains("muse-assist") || low.contains("muse_assist") { return "provider-muse-assist" } | ||
| if low.contains("muse-code") || low.contains("muse_code") { return "provider-muse-code" } | ||
| if low.contains("muse") { return "provider-muse-code" } |
There was a problem hiding this comment.
Verification gap in the HogHunterIOS simulator verification leaves the added low.contains("muse") fallback to provider-muse-code unverified for generic Muse identifiers because the diff contains no simulator screenshot capture. Add an automated xcrun simctl io booted screenshot <artifact> step to the simulator verification.
Also found in:
ios/CodeCapsCompanion/Widgets/WidgetViews.swift:142-142ios/CodeCapsCompanion/Widgets/WidgetViews.swift:143-143
Kody rule violation: Gate iOS/TestFlight releases on a signing-safe workflow and verify UI changes with automated screenshots
Prompt for LLM
File ios/CodeCapsCompanion/Widgets/WidgetViews.swift:
Line 144:
Verification gap in the `HogHunterIOS` simulator verification leaves the added `low.contains("muse")` fallback to `provider-muse-code` unverified for generic Muse identifiers because the diff contains no simulator screenshot capture. Add an automated `xcrun simctl io booted screenshot <artifact>` step to the simulator verification.
**Also found in:**
- `ios/CodeCapsCompanion/Widgets/WidgetViews.swift:142-142`
- `ios/CodeCapsCompanion/Widgets/WidgetViews.swift:143-143`
Talk to Kody by mentioning @kody
Was this suggestion helpful? React with 👍 or 👎 to help Kody learn from this interaction.
Summary
GlanceFooterProminentButtonStyle), exactly matching the runaway notice marquee banner's 28pt height andRoundedRectangle(cornerRadius: 6).QuotaProviders.expected, expanding expected quota providers from 8 to 9.muse-assist,muse-assistant,muse-code,muse,muse-cli, andmuse-sdk.Validation
QuotaCoreTests(390 tests) andCodeCapsTests(331 tests).xcodebuildbuild ofCodeCapsCompanioniOS Simulator target.